/**
 * # 参数列表实体类:
 *  List - 通知列表
 * 
 * # 描述:
 *  查询当前用户接收到的通知列表。
 *  
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package com.waln.notifying.outbox.args;

/**
 * 功能 通知列表 的参数列表。
 */
@pittypat.FunctionAnnotation(transaction = false)
public final class List extends pittypat.FunctionArgs {
	/**
	 * 页码。
	 */
	@pittypat.ParameterAnnotation(position = 0, role = pittypat.ParameterRole.PAGE_INDEX)
	public Long pageIndex;

	/**
	 * 页面尺寸。
	 */
	@pittypat.ParameterAnnotation(position = 1, role = pittypat.ParameterRole.PAGE_SIZE)
	public Long pageSize;

	/**
	 * 总行数。
	 */
	@pittypat.ParameterAnnotation(position = 2, direction = pittypat.ParameterDirection.OUT, role = pittypat.ParameterRole.TOTAL_ROWS)
	public Long totalRows;

	/**
	 * 排序名称。
	 */
	@pittypat.ParameterAnnotation(position = 3, role = pittypat.ParameterRole.ORDER_NAME, maxLength = 30)
	public String orderName;

	/**
	 * 排序方向。
	 */
	@pittypat.ParameterAnnotation(position = 4, role = pittypat.ParameterRole.ORDER_DIRECTION, maxLength = 4)
	public String orderDirection;

	/**
	 * 用户 Id。
	 * <p>
	 * 当前用户的 Id，由系统自动设置该参数。
	 */
	@pittypat.ParameterAnnotation(position = 5, role = pittypat.ParameterRole.USER_ID)
	public java.util.UUID userId;

	/**
	 * 通知标题。
	 * <p>
	 * 通知的标题。
	 */
	@pittypat.ParameterAnnotation(position = 6, maxLength = 50)
	public String title;

	/**
	 * 接收人名称。
	 * <p>
	 * 接收人的名称。
	 */
	@pittypat.ParameterAnnotation(position = 7, maxLength = 50)
	public String receiverName;

	/**
	 * 是否已读。
	 * <p>
	 * 查询已读或者未读的通知。
	 */
	@pittypat.ParameterAnnotation(position = 8)
	public Boolean isRead;

	/**
	 * 紧急程度。
	 * <p>
	 * 通知的紧急程度代码：1-常规，2-紧急，4-特急。默认为常规（1）。
	 */
	@pittypat.ParameterAnnotation(position = 9)
	public Byte urgency;

	/**
	 * 分组。
	 * <p>
	 * 通知隶属的分组。
	 */
	@pittypat.ParameterAnnotation(position = 10, maxLength = 30)
	public String group;

	/**
	 * 起始发送日期。
	 * <p>
	 * 消息的接收时间。
	 */
	@pittypat.ParameterAnnotation(position = 11)
	public java.time.LocalDateTime sendTimeFrom;

	/**
	 * 截至发送日期。
	 * <p>
	 * 消息的接收时间。
	 */
	@pittypat.ParameterAnnotation(position = 12)
	public java.time.LocalDateTime sendTimeTo;

	/**
	 * 通知列表。
	 * <p>
	 * 满足条件的通知列表。
	 */
	@pittypat.ParameterAnnotation(position = 13, direction = pittypat.ParameterDirection.OUT)
	public pittypat.DataList<com.waln.notifying.outbox.data.Notification> notifications;

	/**
	 * 初始化 List 类的一个新实例。
	 */
	public List() {
		super();

		// 页码
		this.pageIndex = null;
		// 页面尺寸
		this.pageSize = null;
		// 总行数
		this.totalRows = null;
		// 排序名称
		this.orderName = null;
		// 排序方向
		this.orderDirection = null;
		// 用户 Id
		this.userId = null;
		// 通知标题
		this.title = null;
		// 接收人名称
		this.receiverName = null;
		// 是否已读
		this.isRead = null;
		// 紧急程度
		this.urgency = null;
		// 分组
		this.group = null;
		// 起始发送日期
		this.sendTimeFrom = null;
		// 截至发送日期
		this.sendTimeTo = null;
		// 通知列表
		this.notifications = null;
	}

	/**
	 * 获取指定名称的参数值。
	 * 
	 * @param name
	 * 			参数名称，不区分大小写。
	 * @return 指定名称的参数值。
	 */
	@Override
	public Object getParameterValue(String name) {
		if (name == null || name.length() == 0) {
			return null;
		}

		switch (name.toLowerCase()) {
			case "pageindex":
				return this.pageIndex;
			case "pagesize":
				return this.pageSize;
			case "totalrows":
				return this.totalRows;
			case "ordername":
				return this.orderName;
			case "orderdirection":
				return this.orderDirection;
			case "userid":
				return this.userId;
			case "title":
				return this.title;
			case "receivername":
				return this.receiverName;
			case "isread":
				return this.isRead;
			case "urgency":
				return this.urgency;
			case "group":
				return this.group;
			case "sendtimefrom":
				return this.sendTimeFrom;
			case "sendtimeto":
				return this.sendTimeTo;
			case "notifications":
				return this.notifications;
			default:
				return null;
		}
	}

	/**
	 * 设置指定名称的参数值。
	 * 
	 * @param name
	 * 			参数名称，不区分大小写。
	 * @param value
	 * 			参数值。
	 * 
	 * @throws IllegalArgumentException
	 */
	@SuppressWarnings("unchecked")
	@Override
	public void setParameterValue(String name, Object value) throws IllegalArgumentException {
		if (name == null || name.length() == 0) {
			throw new IllegalArgumentException("没有提供有效的参数名称。");
		}

		switch (name.toLowerCase()) {
			case "pageindex":
				this.pageIndex = (Long) value;
				break;
			case "pagesize":
				this.pageSize = (Long) value;
				break;
			case "totalrows":
				this.totalRows = (Long) value;
				break;
			case "ordername":
				this.orderName = (String) value;
				break;
			case "orderdirection":
				this.orderDirection = (String) value;
				break;
			case "userid":
				this.userId = (java.util.UUID) value;
				break;
			case "title":
				this.title = (String) value;
				break;
			case "receivername":
				this.receiverName = (String) value;
				break;
			case "isread":
				this.isRead = (Boolean) value;
				break;
			case "urgency":
				this.urgency = (Byte) value;
				break;
			case "group":
				this.group = (String) value;
				break;
			case "sendtimefrom":
				this.sendTimeFrom = (java.time.LocalDateTime) value;
				break;
			case "sendtimeto":
				this.sendTimeTo = (java.time.LocalDateTime) value;
				break;
			case "notifications":
				this.notifications = (pittypat.DataList<com.waln.notifying.outbox.data.Notification>) value;
				break;
			default:
				throw new IllegalArgumentException(name + " 不是 " + this.getClass().getName() + " 的有效参数属性名称。");
		}
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 * 			目标文本流。
	 * 
	 * @throws IllegalArgumentException
	 * @throws java.io.IOException
	 */
	@Override
	public void write(java.io.Writer writer) throws IllegalArgumentException, java.io.IOException {
		if (writer == null) {
			throw new IllegalArgumentException("writer 为 null。");
		}

		writer.write('{');

		// 页码
		writer.write("\"pageIndex\":");
		pittypat.Json.write(writer, this.pageIndex);
		writer.write(',');

		// 页面尺寸
		writer.write("\"pageSize\":");
		pittypat.Json.write(writer, this.pageSize);
		writer.write(',');

		// 总行数
		writer.write("\"totalRows\":");
		pittypat.Json.write(writer, this.totalRows);
		writer.write(',');

		// 排序名称
		writer.write("\"orderName\":");
		pittypat.Json.write(writer, this.orderName);
		writer.write(',');

		// 排序方向
		writer.write("\"orderDirection\":");
		pittypat.Json.write(writer, this.orderDirection);
		writer.write(',');

		// 用户 Id
		writer.write("\"userId\":");
		pittypat.Json.write(writer, this.userId);
		writer.write(',');

		// 通知标题
		writer.write("\"title\":");
		pittypat.Json.write(writer, this.title);
		writer.write(',');

		// 接收人名称
		writer.write("\"receiverName\":");
		pittypat.Json.write(writer, this.receiverName);
		writer.write(',');

		// 是否已读
		writer.write("\"isRead\":");
		pittypat.Json.write(writer, this.isRead);
		writer.write(',');

		// 紧急程度
		writer.write("\"urgency\":");
		pittypat.Json.write(writer, this.urgency);
		writer.write(',');

		// 分组
		writer.write("\"group\":");
		pittypat.Json.write(writer, this.group);
		writer.write(',');

		// 起始发送日期
		writer.write("\"sendTimeFrom\":");
		pittypat.Json.write(writer, this.sendTimeFrom);
		writer.write(',');

		// 截至发送日期
		writer.write("\"sendTimeTo\":");
		pittypat.Json.write(writer, this.sendTimeTo);
		writer.write(',');

		// 通知列表
		writer.write("\"notifications\":");
		pittypat.Json.write(writer, this.notifications);

		writer.write('}');
	}
}
